package tournoi.modele;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;

@Entity
public class Colonne {

	public enum EtatColonne {
		ATTENTE, ENCOURS, FINI
	};

	public Colonne() {
		etat = EtatColonne.ATTENTE;
		lesMatchs = new ArrayList<Rencontre>();
		lesEquipes = new ArrayList<Equipe>();
	}

	private Integer idColonne;
	private List<Rencontre> lesMatchs;
	private List<Equipe> lesEquipes;
	private EtatColonne etat;

	/*
	 * Getters & Setters
	 */

	@Id
	@GeneratedValue
	public Integer getIdColonne() {
		return idColonne;
	}

	public void setIdColonne(Integer idColonne) {
		this.idColonne = idColonne;
	}

	@OneToMany(targetEntity = Rencontre.class, cascade = { CascadeType.ALL })
	public List<Rencontre> getLesMatchs() {
		return lesMatchs;
	}

	public void setLesMatchs(List<Rencontre> lesMatchs) {
		this.lesMatchs = lesMatchs;
	}

	@ManyToMany(targetEntity = Equipe.class, cascade = { CascadeType.ALL })
	public List<Equipe> getLesEquipes() {
		return lesEquipes;
	}

	public void setLesEquipes(List<Equipe> lesEquipes) {
		this.lesEquipes = lesEquipes;
	}

	public EtatColonne getEtat() {
		return etat;
	}

	public void setEtat(EtatColonne etat) {
		this.etat = etat;
	}

	/*
	 * Methodes pour la gestion de tournoi
	 */

	public Integer nombreEquipes() {
		return lesEquipes.size();
	}

	public Integer nombreMatchs() {
		return lesMatchs.size();
	}

	public Boolean termine() {
		return (etat == EtatColonne.FINI);
	}

	/**
	 * Récupére la liste de tous les gagnants de cette phase
	 * 
	 * @return List<Equipe>
	 */
	public List<Equipe> gagnants() {
		List<Equipe> le = new ArrayList<Equipe>();
		for (Rencontre match : lesMatchs) {
			le.add(match.gagnant());
		}
		return le;
	}

	public Rencontre getMatch(int id) {
		for (Rencontre r : lesMatchs) {
			if (r.getIdRencontre() == id) {
				return r;
			}
		}
		return null;
	}

	/**
	 * On commence la phase, la distribution des équipes et leurs recontres
	 */
	public void demarrerPhase() {
		if (etat == EtatColonne.ATTENTE) {
			int numMatch = 0;
			Rencontre r;
			for (int i = 0; i < lesEquipes.size(); i += 2) {
				r = lesMatchs.get(numMatch++);
				r.setEquipeUne(lesEquipes.get(i));
				r.setEquipeDeux(lesEquipes.get(i + 1));
			}
			etat = EtatColonne.ENCOURS;
		}

	}

	/**
	 * On vérifie si la phase est terminée
	 * 
	 * @return true if terminée/false sinon
	 */
	public boolean verifier() {
		if (etat == EtatColonne.ATTENTE)
			return false;
		else if (etat == EtatColonne.FINI) {
			return true;
		} else if (etat == EtatColonne.ENCOURS) {
			boolean terminer = true;
			for (Rencontre r : lesMatchs) {
				if (!r.getTermine()) {
					terminer = false;
				}
			}
			if (terminer)
				etat = EtatColonne.FINI;
			return terminer;
		}
		return false;
	}
}
